package study.itwill.team5.member;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;

import org.apache.log4j.Logger;

import study.itwill.common.DBHandler;


public class WishList {
	Calendar cal = Calendar.getInstance();
	int yy = cal.get(Calendar.YEAR);
	int mm = cal.get(Calendar.MONTH) + 1;
	int dd = cal.get(Calendar.DAY_OF_MONTH);
	int hh = cal.get(Calendar.HOUR_OF_DAY);
	int mi = cal.get(Calendar.MINUTE);
	int ss = cal.get(Calendar.SECOND);
	String time = String.format("%04d%02d%02d%02d%02d%02d",
			yy, mm, dd, hh, mi, ss);
	
	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(WishList.class);
		
	/**
	 * 나의 찜 추가 기능
	 * @param member_seq	- 회원 테이블의 일련번호
	 * @param house_seq		- 민박 테이블의 일련번호
	 * @return				- 추가 성공 - true, 추가 실패 - false
	 */
	public boolean addWishlist(int member_seq, int house_seq) {
		logger.debug("========== method start >> addWishlist");
		logger.debug(" ----- [PARAMS INFO] -----");
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
	
		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 
		// 무조건 하면 된다.
		DBHandler.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO wishlist(member_seq, house_seq, reg_date"
				+ ") VALUE (%d, %d, '%s')";
		
		boolean result = DBHandler.execSql(sql, member_seq, house_seq, time);
		
		if (result) {
			DBHandler.commit();
			logger.debug("처리결과 >>나의 찜 등록 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 추가 실패");
		}
		
		logger.debug("========== method end >> addWishlist");
		
		return result;
	}

	
	
	public WishItem viewWishList(int member_seq, int house_seq) {
		logger.debug("=============== method start >> viewWishList");
		logger.debug(" ------ [PARAMS INFO] ------");
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
		
		WishItem item = null;
		
		// 데이터 조회
		String sql = "SELECT w.member_seq, m.user_name, w.house_seq, h.name, w.reg_date " 
				+ "FROM house h, wishlist w, member m "
				+ "WHERE h.seq = w.house_seq AND w.member_seq = m.seq "
				+ "AND m.seq=%d "
				+ "AND h.seq=%d";
		
		ResultSet rs = DBHandler.getResult(sql, member_seq, house_seq);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int n_member_seq = rs.getInt(1);
				String user_name = rs.getString(2);
				int n_house_seq = rs.getInt(3);
				String name = rs.getString(4);
				String reg_date = rs.getString(5);
				
				// 2) 추출된 값을 객체로 구성
				item = new WishItem(n_member_seq, user_name, n_house_seq, name, reg_date);
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
				
		logger.debug("=============== method end >> viewWishList");
		
		return item;
	}
	
	/**
	 * 나의 찜 목록 기능
	 * @return				- HouseItem (ArrayList) 찜 목록 여러개를 리턴
	 */
	public ArrayList<WishItem> listWishList() {
		logger.debug("========== method start >> listWishlist");
		logger.debug(" ----- [PARAMS INFO] -----");

		
		ArrayList<WishItem> list = null;
		
		// 데이터 조회
		String sql =  "SELECT w.member_seq, m.user_name, w.house_seq, h.name, w.reg_date " 
				+ "FROM house h, wishlist w, member m "
				+ "WHERE h.seq = w.house_seq AND w.member_seq = m.seq";
	

		
		ResultSet rs = DBHandler.getResult(sql);
		
		if(rs != null) {
			try {
				
				list = new ArrayList<WishItem>();
				
				
				while (rs.next()) {
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int n_member_seq = rs.getInt(1);
					String user_name = rs.getString(2);
					int n_house_seq = rs.getInt(3);
					String name = rs.getString(4);
					String reg_date = rs.getString(5);
					
					// 2) 추출된 값을 객체로 구성
					WishItem item = new WishItem(n_member_seq, user_name, n_house_seq, name, reg_date);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try{
					rs.close();
				} catch (SQLException e){
					rs = null;
				}
				
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("========== method end >> listWishlist");
		
		return list;
	}
	
	/**
	 * 나의 찜 삭제 기능
	 * @param member_seq	- 회원 테이블의 일련번호
	 * @param house_seq		- 민박 테이블의 일련번호
	 * @return				- 삭제 성공 - true, 삭제 실패 - false
	 */
	public boolean deleteWishlist(int member_seq, int house_seq) {
		logger.debug("========== method start >> deleteWishlist");
		logger.debug(" ----- [PARAMS INFO] -----");
		logger.debug("[PARAMS] member_seq=" + member_seq);
		logger.debug("[PARAMS] house_seq=" + house_seq);
		
		boolean result  = false;
		
		DBHandler.beginTrans();
		
		String sql = "DELETE FROM wishlist WHERE member_seq=%d and house_seq=%d";
		result = DBHandler.execSql(sql, member_seq, house_seq);
		
		if(result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + member_seq + "번 회원 나의 찜 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.debug("처리결과 >> 데이터 삭제 실패");
		}
		logger.debug("========== method end >> deleteStudent");
		
		return result;
	}
}
